#ifndef _JIAJIA_FILE_H
#define _JIAJIA_FILE_H

/* 该文件被内嵌到 jiajia_lmcc.h 文件中，使用请 #include"jiajia_lmcc.h" */

/* 该文件 lmcc 包含在 jiajia_lmcc.h 中 */

#include"jiajia_stream.h"

#define JiaJia_file_rows(jjfile) (JiaJia_stream_rows((jjfile)->stream))
#define JiaJia_file_cols(jjfile) (JiaJia_stream_cols((jjfile)->stream->cols))

/* 该类型为用于存储加加代码文件的结构体 */
typedef struct JiaJia_file{
    int32_t stat;               /* 记录 jjfile 的状态 */
    const char *fname;          /* 记录 jjfile 打开时的文件名 */
    JiaJia_stream_pt stream;    /* 文本流 */

    JiaJia_word_pt word_begin;      /* word 开端 */
    JiaJia_word_pt word_end;        /* word 结尾 */
    JiaJia_word_pt word_next;       /* 下一个返回的 word */
    JiaJia_word_pt word_reduce;     /* reduce 阶段的 word 栈顶 */
    JiaJia_item_pt item_reduce;     /* reduce 阶段的 item 栈顶 */
    JiaJia_reduce_env_t reduce_env; /* reduce 时刻环境 */
    JiaJiaLmcc_pdata_pt pdata_top;  /* lmcc parse data 栈 */

    struct JiaJia_file *last_file;  /* 前一个文件 */
} JiaJia_file_t, *JiaJia_file_pt;

typedef struct JiaJia_file_pool{
    JiaJia_file_pt last_file;   /* 文件打开列表 */
} JiaJia_file_pool_t;

/* 返回最新打开的文件 */
extern JiaJia_file_pt JiaJia_file_top();
/* 打开加加代码文件 */
extern JiaJia_file_pt JiaJia_file_open(const char *);
/* 关闭加加代码文件 */
extern void JiaJia_file_close();

/* 压入新 parse data */
extern JiaJiaLmcc_pdata_pt JiaJia_file_push_pdata();
/* 弹出当前 parse data */
extern void JiaJia_file_pop_pdata();

#endif
